package com.tp2.etna.distribucion2.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.tp2.etna.distribucion2.constante.ConstanteDist2;
import com.tp2.etna.distribucion2.dao.BackOrderDAO;
import com.tp2.etna.distribucion2.dao.EntregaDetalleDist2DAO;
import com.tp2.etna.distribucion2.dao.EntregaDist2DAO;
import com.tp2.etna.distribucion2.dao.ProductoBackOrderDAO;
import com.tp2.etna.distribucion2.modelo.BackOrder;
import com.tp2.etna.distribucion2.modelo.Entrega;
import com.tp2.etna.distribucion2.modelo.EntregaDetalle;
import com.tp2.etna.distribucion2.modelo.Producto;
import com.tp2.etna.distribucion2.modelo.ProductoBackOrder;

@Service
public class ActualizarCantidadEntregaServiceImpl implements
		ActualizarCantidadEntregaService {
	
	@Autowired
	private EntregaDist2DAO entregaDist2DAO;
	@Autowired
	private EntregaDetalleDist2DAO entregaDetalleDist2DAO;
	@Autowired
	private BackOrderDAO backOrderDAO;
	@Autowired
	private ProductoBackOrderDAO productoBackOrderDAO;
	
	@Override
	public List<Entrega> obtenerEntregasPendientes(Date fecha) {
		return entregaDist2DAO.listarPendientes(fecha != null ? new java.sql.Date(fecha.getTime()): null);
	}

	@Override
	public Entrega obtenerEntrega(int id) {
		
		return entregaDist2DAO.getEntregaDist2ById(id);
	}

	@Override
	public Integer actualizarCantidad(Entrega entrega) {
		if(validarAceptacion(entrega)){
			entregaDetalleDist2DAO.actualizarDetalle(entrega);
			entregaDist2DAO.actualizarEstado(ConstanteDist2.ESTADO_ENTREGA_CANT_CONFIRMADA,entrega.getCodigo());
			return 1;
		}else{
			BackOrder backOrder = new BackOrder();
			backOrder.setEntrega(entrega);
			backOrderDAO.insert(backOrder);
			if(backOrder.getCodigo() != null){
				backOrder.setDetalle(new ArrayList<ProductoBackOrder>());
				for (EntregaDetalle entregaDetalle : entrega.getDetalle()) {
					if(entregaDetalle.getCantidadConfirmada() < entregaDetalle.getCantidadEntregaProg()){
						ProductoBackOrder productoBackOrder = new ProductoBackOrder();
						productoBackOrder.setBackOrder(backOrder);
						productoBackOrder.setProducto(new Producto());
						productoBackOrder.getProducto().setCodigo(entregaDetalle.getCodigoProducto());
						productoBackOrder.setCantidad(entregaDetalle.getCantidadEntregaProg() - entregaDetalle.getCantidadConfirmada());
						backOrder.getDetalle().add(productoBackOrder);
					}
				}
				
				productoBackOrderDAO.insertar(backOrder);
			}
			entregaDist2DAO.actualizarEstado(ConstanteDist2.ESTADO_ENTREGA_CANCELADA_BACK_ORDER,entrega.getCodigo());
			return 2;
		}
	}
	
	private boolean validarAceptacion(Entrega entrega){
		int cantConfirmadaTotal = 0;
		int canProgramadaTotal = 0;
		for (EntregaDetalle detalle : entrega.getDetalle()) {
			cantConfirmadaTotal += detalle.getCantidadConfirmada();
			canProgramadaTotal += detalle.getCantidadEntregaProg();
		}
		int cantidadMinima = (new Double(canProgramadaTotal*(entrega.getClienteAceptacion()/100))).intValue();
		
		if(cantConfirmadaTotal<cantidadMinima)
			return false;
		else
			return true;
	}

}
